home *** CD-ROM | disk | FTP | other *** search
-
- /*****************************************************
- *
- * file d:\cips\display.c
- *
- * Functions: This file contains
- * display_image
- * display_image_portion
- * display_menu_for_display_image
- * map_16_shades_of_gray
- * transform_the_colors
- *
- * Purpose:
- * These functions display images on a the
- * monitor.
- *
- * External Calls:
- * rtiff.c - read_tiff_image
- * cips.c - clear_text_screen
- * hist.c - zero_histogram
- * calculate_histogram
- * perform_histogram_equalization
- *
- * Modifications:
- * 17 June 1987 - created
- * August 1990 - extension modifications for use
- * in the C Image Processing System.
- *
- ********************************************************/
-
-
- #include "d:\cips\cips.h"
-
-
-
-
-
- /***************************
- *
- * display_image(...
- *
- ****************************/
-
-
- display_image(file_name, image, il, ie, ll, le,
- image_header, monitor_type, color_transform,
- invert, image_colors, display_colors,
- show_hist)
- char color_transform[],
- file_name[],
- monitor_type[];
- int display_colors,
- image_colors,
- invert,
- il,
- ie,
- ll,
- le,
- show_hist;
- short image[ROWS][COLS];
- struct tiff_header_struct *image_header;
- {
- char channels[80],
- response[80];
-
- int a,
- b,
- c,
- channel,
- count,
- display_mode,
- key,
- horizontal,
- max_horizontal,
- max_vertical,
- not_finished,
- r,
- vertical,
- x_offset,
- y_offset;
-
- unsigned int block,
- color,
- i,
- j,
- x,
- y;
-
- unsigned long histogram[256], new_hist[256];
-
-
-
- /*************************************************
- *
- * If you want to display the histogram and do not
- * want to perform hist equalization, then
- * zero the histogram for calculations.
- *
- *************************************************/
-
- if( (show_hist == 1) &&
- (color_transform[0] != 'H'))
- zero_histogram(histogram);
-
- not_finished = 1;
- while(not_finished){
-
-
- if(display_colors == 16){
- if(monitor_type[0] == 'V'){
- horizontal = 4;
- vertical = 6;
- display_mode = _VRES16COLOR; /* MSC 6.0 */
- } /* ends if V */
- if(monitor_type[0] == 'E'){
- horizontal = 3;
- vertical = 6;
- display_mode = _ERESCOLOR; /* MSC 6.0 */
- } /* ends if E */
-
- } /* ends if colors == 16 */
-
- else{
- horizontal = 2;
- vertical = 2;
- display_mode = _MAXCOLORMODE; /* MSC 6.0 */
- }
-
-
- max_horizontal = (image_header->image_length+50)/100;
- max_vertical = (image_header->image_width+50)/100;
-
- if(horizontal > max_horizontal) horizontal = max_horizontal;
- if(vertical > max_vertical) vertical = max_vertical;
-
-
-
- /****************************************
- *
- * If color transform wants histogram
- * equalization, then read in the
- * image arrays and calculate the
- * histogram. Zero both the histogram
- * and the new_hist. You will need the
- * new_hist if you want to display the
- * equalized hist.
- *
- *****************************************/
-
- if(color_transform[0] == 'H'){
- count = 1;
- zero_histogram(histogram);
- zero_histogram(new_hist);
- for(a=0; a<vertical; a++){
- for(b=0; b<horizontal; b++){
-
- x = a*100;
- y = b*100;
-
- printf("\nDISPLAY> Calculating histogram");
- printf(" %d of %d",count,vertical*horizontal);
- count++;
- read_tiff_image(file_name, image, il+y,
- ie+x, ll+y, le+x);
- calculate_histogram(image, histogram);
-
- } /* ends loop over b */
- } /* ends loop over a */
- } /* ends if display_mode == H */
-
-
-
- /* set graphics mode */
-
- _setvideomode(display_mode); /* MSC 6.0 */
- if(display_colors == 16) map_16_shades_of_gray(display_mode);
-
-
-
- /****************************************
- *
- * Loop over this size and
- * read and display ROWSxCOLS arrays.
- *
- * If you want to show the histogram AND
- * do not want to do hist equalization
- * then calculate the hist from the
- * original image array.
- *
- * If you want to do hist equalization
- * then calculate the new_hist AFTER
- * the image has been equalized by the
- * the transform_the_colors function.
- *
- * NOTE: Remember that the function
- * transform_the_colors changes the
- * gray shade values in image array.
- *
- *****************************************/
-
- for(a=0; a<vertical; a++){
- for(b=0; b<horizontal; b++){
-
- x = a*100;
- y = b*100;
- read_tiff_image(file_name, image, il+y,
- ie+x, ll+y, le+x);
- if( (show_hist == 1) &&
- (color_transform[0] != 'H'))
- calculate_histogram(image, histogram);
-
- transform_the_colors(image, color_transform,
- display_colors,
- image_colors, histogram,
- horizontal, vertical);
-
- if(color_transform[0] == 'H')
- calculate_histogram(image, new_hist);
- display_image_portion(image, x, y, display_colors,
- image_colors, invert);
- } /* ends loop over b */
- } /* ends loop over a */
-
-
- /***************************
- *
- * if show_hist == 1 then
- * display the histogram
- * in the lower right hand
- * corner of screen
- *
- * If hist equalization was
- * performed then show the
- * new_hist. If it wasn't
- * done then show the original
- * histogram.
- *
- ****************************/
-
- if(show_hist == 1){
- if(monitor_type[0] == 'V')
- y_offset = 470;
- if(monitor_type[0] == 'E')
- y_offset = 310;
- x_offset = 380;
- if(color_transform[0] == 'H')
- display_histogram(new_hist, x_offset,
- y_offset, 10, 15);
- else
- display_histogram(histogram, x_offset,
- y_offset, 10, 15);
- }
-
- read_string(response);
- printf("\nEnter 0 to quit 1 to do again");
- get_integer(¬_finished);
-
- /* set display back to text mode */
- clear_text_screen();
-
-
- } /* ends while not_finished */
-
- } /* ends main */
-
-
-
-
-
-
-
- /***********************************************
- *
- * display_menu_for_display_image(
- *
- ************************************************/
-
-
- display_menu_for_display_image(image_colors, display_colors,
- invert, color_transform,
- monitor_type,
- show_hist)
- char color_transform[], monitor_type[];
- int *invert, *image_colors, *display_colors, *show_hist;
- {
- char response[80];
- int int_response, not_finished, r;
-
- not_finished = 1;
- while(not_finished){
- printf("\n\nDISPLAY> Enter choice (0 for no change) ");
- printf("\nDISPLAY> 1. Invert is %d (1=on 0=off)", *invert);
- printf("\nDISPLAY> 2. Color Transform-- %s",
- color_transform);
- printf("\nDISPLAY> 3. Input image has %d colors",
- *image_colors);
- printf("\nDISPLAY> 4. Display will show %d colors",
- *display_colors);
- printf("\nDISPLAY> 5. Monitor type is %s",
- monitor_type);
- printf("\nDISPLAY> 6. Histogram is %d", *show_hist);
- printf(" (1=show 0=don't show)");
- printf("\nDISPLAY> _\b");
- get_integer(&r);
-
- if(r == 0){
- not_finished = 0;
- }
-
- if(r == 1){
- printf("\nDISPLAY> Enter 1 for invert on");
- printf(" 0 for invert off");
- printf("\nDISPLAY> ___");
- get_integer(&int_response);
- *invert = int_response;
- } /* ends if r == 1 */
-
- if(r == 2){
- printf("\nDISPLAY> Enter the new color transform mode ");
- printf("\nDISPLAY> (S) Straight mode");
- printf(" (H) Histogram Equalization");
- printf("\nDISPLAY> _\b");
- read_string(response);
- if((response[0] == 'S') ||
- (response[0] == 's'))
- strcpy(color_transform, "Straight mode");
- else
- strcpy(color_transform,
- "Histogram Equalization mode");
- } /* ends if r == 2 */
-
- if(r == 3){
- printf("\nDISPLAY> Enter the number of colors");
- printf(" in the input image");
- printf("\nDISPLAY> ___");
- get_integer(&int_response);
- *image_colors = int_response;
- } /* ends if r == 3 */
-
- if(r == 4){
- printf(
- "\nDISPLAY> Enter the number of colors for the display");
- printf("\nDISPLAY> ___");
- get_integer(&int_response);
- *display_colors = int_response;
- } /* ends if r == 4 */
-
- if(r == 5){
- printf("\nDISPLAY> Enter the new monitor type");
- printf("\nDISPLAY> (E) EGA (V) VGA");
- printf(" (C) CGA (M) Monochrome");
- printf("\nDISPLAY> _\b");
- read_string(response);
- if((response[0] == 'E') ||
- (response[0] == 'e'))
- strcpy(monitor_type, "EGA");
- if((response[0] == 'V') ||
- (response[0] == 'v'))
- strcpy(monitor_type, "VGA");
- if((response[0] == 'C') ||
- (response[0] == 'c'))
- strcpy(monitor_type, "CGA");
- if((response[0] == 'M') ||
- (response[0] == 'm'))
- strcpy(monitor_type, "Monochrome");
- } /* ends if r == 5 */
-
- if(r == 6){
- printf(
- "\nDISPLAY> Enter 1 for show histogram 0 for don't");
- printf("\nDISPLAY> ___");
- get_integer(&int_response);
- *show_hist = int_response;
- } /* ends if r == 6 */
-
-
-
- } /* ends while not_finished */
- } /* ends display_menu */
-
-
-
-
-
-
-
-
-
- /********************************
- *
- * display_image_portion(...
- *
- *********************************/
-
-
-
-
- display_image_portion(image, x, y, display_colors, image_colors,
- invert)
- int invert, display_colors, image_colors;
- short image[ROWS][COLS];
- unsigned int x, y;
- {
- unsigned int color, i, j;
-
-
- if(invert == 1){
- for(i=0; i<ROWS; i++)
- for(j=0; j<COLS; j++)
- image[i][j] = (display_colors-1)-image[i][j];
- } /* ends if invert == 1 */
-
-
- for(i=0; i<ROWS; i++){
- for(j=0; j<COLS; j++){
-
- _setcolor(image[i][j]); /* MSC 6.0 statements */
- _setpixel(j+x, i+y);
-
- } /* ends loop over j */
- } /* ends loop over i */
-
- } /* ends display_image_portion */
-
-
-
-
-
-
-
-
-
- /**********************************************
- *
- * map_16_shades_of_gray(...
- *
- * This function maps 16 shades of gray into
- * the first 16 color indices. This allows
- * you to display a true "black and white"
- * image on a color monitor.
- *
- *********************************************/
-
-
- map_16_shades_of_gray(display_mode)
- int display_mode;
- {
- /* all MSC 6.0 statements */
- _setvideomode(display_mode);
- _remappalette(0, 0x000000L);
- _remappalette(1, 0x040404L);
- _remappalette(2, 0x080808L);
- _remappalette(3, 0x0c0c0cL);
- _remappalette(4, 0x101010L);
- _remappalette(5, 0x141414L);
- _remappalette(6, 0x181818L);
- _remappalette(7, 0x1c1c1cL);
- _remappalette(8, 0x202020L);
- _remappalette(9, 0x242424L);
- _remappalette(10, 0x282828L);
- _remappalette(11, 0x2c2c2cL);
- _remappalette(12, 0x303030L);
- _remappalette(13, 0x343434L);
- _remappalette(14, 0x383838L);
- _remappalette(15, 0x3f3f3fL);
- }
-
-
-
-
-
-
- /*********************************************
- *
- * transform_the_colors(...
- *
- * This function transforms the gray shades
- * in the image array for display. It can either
- * do it in straight mode by multiplying or
- * dividing or it can do it with hist
- * equalization by calling the function
- * perform_histogram_equalization.
- *
- *************************************************/
-
-
- transform_the_colors(image, color_transform,
- display_colors, image_colors,
- histogram, horizontal,
- vertical)
- char color_transform[];
- int display_colors, horizontal,
- image_colors, vertical;
- short image[ROWS][COLS];
- unsigned long histogram[];
- {
- int color, i, j;
- float new_grays, area;
- unsigned long x;
-
- if(color_transform[0] == 'S'){
- for(i=0; i<ROWS; i++){
- for(j=0; j<COLS; j++){
-
-
- if( (display_colors == 16) &&
- (image_colors == 256))
- color = image[i][j]/16;
- if( (display_colors == 16) &&
- (image_colors == 16))
- color = image[i][j];
- if( (display_colors == 256) &&
- (image_colors == 256))
- color = image[i][j];
- if( (display_colors == 256) &&
- (image_colors == 16))
- color = image[i][j]*16;
-
- image[i][j] = color;
-
-
- } /* ends loop over j */
- } /* ends loop over i */
- } /* ends if transform is straight */
-
-
- if(color_transform[0] == 'H'){
-
- area = ((long)(vertical))*((long)(horizontal));
- area = area*10000.0;
- new_grays = display_colors;
-
- perform_histogram_equalization(image, histogram,
- new_grays, area);
-
- } /* ends if transform is hist equalization */
-
- } /* ends transform_the_colors */
-